package main

/*
* Content: 字符串声明-初始化方式、循环输出字符串、字符串的切片操作、字符换与字节数组、buffer中的方法
* --------------------------------------------------
* 你会用Go语言的rune类型吗？: https://juejin.cn/post/7068726981159829541
 */

import (
	"bytes"
	"fmt"
)

func MyString() {

	// 字符串声明-初始化方式
	fmt.Println("--------------------字符串声明-初始化方式--------------------")

	// 声明 并 初始化方式
	var str1 string = "hello"
	str2 := "world"
	println("str1 + str2: " + str1 + " " + str2)

	var str3 string = `     // 多行字符串
		Xie
		Qing
		Zhao`
	fmt.Printf("多行字符串: %v\n", str3)

	// len() 获得的是 byte 字节的数量，一个英文占1个字符、中文占用3个字节
	strLen := len(str1)
	fmt.Printf("str1字符串长度: %v\n", strLen)

	// 循环输出字符串
	fmt.Println("--------------------循环输出字符串--------------------")

	// 这种输出方式中文会乱码
	s := "Hello王"
	for i := 0; i < len(s); i++ {
		fmt.Printf("%c\n", s[i]) // %c: 输出字符
	}

	// 循环输出中文字符串
	sC := "Hello王"
	for _, c := range sC {
		fmt.Printf("%c\n", c) //%c 字符
	}

	// 字符串的切片操作
	fmt.Println("--------------------字符串的切片操作--------------------")

	str6 := "xie qing zhao"
	a := 2
	b := 5
	fmt.Printf("s[a]: %v\n", str6[a])
	fmt.Printf("s[a:b]: %v\n", str6[a:b])
	fmt.Printf("s[a:]: %v\n", str6[a:])
	fmt.Printf("s[:b]: %v\n", str6[:b])

	// 字符串修改
	fmt.Println("--------------------字符串修改--------------------")

	s2 := "小白兔"
	s3 := []rune(s2)        //把字符串强制转成rune切片
	s3[0] = '大'             //注意 这里需要使用单引号的字符，而不是双引号的字符串
	fmt.Println(string(s3)) //把rune类型的s3强转成字符串

	// 字符换与字节数组
	fmt.Println("--------------------字符串与字节数组--------------------")

	byte18 := []byte("hello go")
	str18 := string([]byte{97, 98, 99})
	fmt.Printf("字节数组: %v, 字符串: %v\n", byte18, str18)

	// buffer中的方法
	fmt.Println("--------------------buffer中的方法--------------------")

	var bt bytes.Buffer
	bt.WriteString(str1)
	bt.WriteString(str2)
	str5 := bt.String()
	fmt.Printf("bytes.Buffer拼接字符串: %v\n", str5)

}
